/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package agentes;

import jade.content.lang.Codec;
import jade.content.lang.sl.SLCodec;
import jade.content.onto.Ontology;
import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.domain.df;
import jade.domain.FIPAAgentManagement.AMSAgentDescription;
import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
//import jade.gui.*;
import jade.wrapper.AgentController;
import jade.wrapper.ControllerException;
import java.util.logging.Level;
import java.util.logging.Logger;


import Ontologia.*;
import hibernate.NewHibernateUtil;
import jade.content.ContentElement;
import jade.content.onto.OntologyException;
import jade.content.onto.UngroundedException;
import jade.core.behaviours.CyclicBehaviour;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import vista.Material2;
////////////////////////////
//En este caso la clase puede implementar ontologias mediante la 
//sentencia implements <<nombre de la ontologia>> //////////////////////////////////////////////////////////////

public class BuscadorContenido extends Agent {

    //¿que hace esto?
    private Codec codec = new SLCodec();
    private Ontology ontologia = OAOntology.getInstance();
    private AgentController buscadorAg;
    Material2 vistaMaterialCurso;

    protected void setup() {
        getContentManager().registerLanguage(codec);
//        getContentManager().registerOntology(ontologia);
        jade.wrapper.AgentContainer containerController = this.getContainerController();
        // Enable O2A communication
        setEnabledO2ACommunication(true, 0);

        try {
            buscadorAg = containerController.getAgent("Buscador");
        } catch (ControllerException ex) {
            Logger.getLogger(BuscadorContenido.class.getName()).log(Level.SEVERE, null, ex);

        }

        //Lanza la interfaz de MaterialCurso y se envia como parametro el controlador de este agente para establecer puente interfaz-agente
//        vistaMaterialCurso = new Material(buscadorAg);
//        vistaMaterialCurso.setVisible(true);
//        vistaMaterialCurso = new Material2(buscadorAg);
//        vistaMaterialCurso.setVisible(true);

//        this.addBehaviour(new Behaviour(this) {
//            public void action() {
//              
//            }
//        });
        this.addBehaviour(new BusquedaContenidos(this));


    }

    // Finalización del agente
    protected void takeDown() {
    }

    //Se agregan los  comportamientos del agente
    private class BusquedaContenidos extends CyclicBehaviour {

        private SessionFactory sessionFactory;

        public BusquedaContenidos(Agent a) {
            super(a);
        }

        public void action() {
            
            System.out.println("entramos al action");
            MessageTemplate mt = MessageTemplate.and(
                    MessageTemplate.MatchLanguage(codec.getName()),
                    MessageTemplate.MatchOntology(ontologia.getName()));
            ACLMessage mensaje = blockingReceive(mt);
            if (mensaje.equals(null)) {



                Session session = null;
                OA oaTemp = (OA) myAgent.getO2AObject();
                
               
                System.out.println("titulo enviado " + oaTemp.getTitulo());
                try {
                    try {

                        sessionFactory = NewHibernateUtil.getSessionFactory();
                        session = sessionFactory.openSession();
                        Transaction tx = session.beginTransaction();

//                    Query query = session.createQuery("from OA where titulo = '" + nombreLibro + "' ");
                        Query query = session.createQuery("from OA where titulo = '" + oaTemp.getTitulo() + "' AND formato =  '" + oaTemp.getFormato() + "' ");
                        List list = query.list();



                        dao.Oa oaRecuperado = null;

                        for (int i = 0; i < list.size(); i++) {
                            oaRecuperado = (dao.Oa) list.get(i);

                        }
                        System.out.println("llegamos aca");
                        System.out.println(oaRecuperado.getTitulo());
                        tx.commit();



                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                } finally {
                    session.close();
                }
                if (mensaje.getPerformative() == ACLMessage.REQUEST) {
//                    try {
                }

            }
        }
//        catch (Codec.CodecException ex) {
//                        Logger.getLogger(OA.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        catch (UngroundedException ex) {
//                        Logger.getLogger(OA.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        catch (OntologyException ex) {
//                        Logger.getLogger(OA.class.getName()).log(Level.SEVERE, null, ex);
//        }
    }
}
//        
//        public void action() {
//
//            Session session = null;
//            OA oaTemp = (OA) myAgent.getO2AObject();
//
//
//            try {
//                try {
//
//                    sessionFactory = NewHibernateUtil.getSessionFactory();
//                    session = sessionFactory.openSession();
//                    Transaction tx = session.beginTransaction();
//
////                    Query query = session.createQuery("from OA where titulo = '" + nombreLibro + "' ");
//                    Query query = session.createQuery("from OA where titulo = '" + oaTemp.getTitulo() + "' AND formato =  '" + oaTemp.getFormato() + "' ");
//                    List list = query.list();
//
//
//
//                    dao.Oa oaRecuperado = null;
//
//                    for (int i = 0; i < list.size(); i++) {
//                        oaRecuperado = (dao.Oa) list.get(i);
//
//                    }
//                    System.out.println(oaRecuperado.getTitulo());
//                    tx.commit();
//
//
//
//                } catch (Exception e) {
//                    System.out.println(e.getMessage());
//                }
//            } finally {
//                session.close();
//            }
//        }

